/*
    一个lua的c库

*/

//#define _POSIX_C_SOURCE >= 199309L

#include <stdio.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>


#include "xlib.h"


//tb_hong_t g_seed = 0;


/*
    取uuid
*/
//static int get_tb_uuid(lua_State *L)
//{
//    const char* str = luaL_checkstring(L, 1);
//    tb_char_t uuid[37];
//    tb_uuid_make_cstr(uuid, str);
////    tb_trace_i("[uuid]: %s", uuid);
//    lua_pushstring(L, uuid);  /* push result */
//    return 1;
//}

/*
    取毫秒时间
*/
//static int get_tb_time(lua_State *L)
//{
//    // done
//    tb_hong_t t = tb_mclock();
//    // trace
//    tb_trace_i("time: %lld", t);
//
//    lua_pushinteger(L, t);
//    return 1;
//}

/*
    取一个随机数
*/
//static int get_tb_random(lua_State *L)
//{
//    tb_long_t b = (tb_long_t)(luaL_checkinteger(L, 1));
//    tb_long_t e = (tb_long_t)(luaL_checkinteger(L, 2));
//    if( g_seed == 0 ){
//        g_seed = tb_mclock();
//        tb_srandom(g_seed);
//    }
//    lua_pushinteger(L, tb_random_range(b, e));
//    return 1;
//}












/* 需要一个"luaL_Reg"类型的结构体，其中每一个元素对应一个提供给Lua的函数。
 * 每一个元素中包含此函数在Lua中的名字，以及该函数在C库中的函数指针。
 * 最后一个元素为“哨兵元素”（两个"NULL"），用于告诉Lua没有其他的函数需要注册。
 */
#define MAX_FUNC_NUM 100 //100个函数应该够我自己写的了
luaL_Reg lib[MAX_FUNC_NUM] = {
//    {"get_uuid", get_tb_uuid},
//    {"get_time", get_tb_time},
//    {"get_random", get_tb_random},
};

//取当前数组可用的一个下标
int get_array_len(luaL_Reg lib[]){
    for(int i=0; i<MAX_FUNC_NUM; i++){
        if(lib[i].name == NULL){
            return i;
        }
    }
    return MAX_FUNC_NUM;
}

/* 此函数为C库中的“特殊函数", 在Windows系统中必须使用"__declspec( dllexport )"导出, 在类Unix上使用"extern"导出
 * 通过调用它注册所有C库中的函数，并将它们存储在适当的位置。
 * 此函数的命名规则应遵循：
 * 1、使用"luaopen_"作为前缀。
 * 2、前缀之后的名字将作为"require"的参数, 所以此名字必须和生成的dll同名否则找不到对应的库
 */
int luaopen_xlib(lua_State* L)
{
    /* void luaL_newlib (lua_State *L, const luaL_Reg l[]);
     * 创建一个新的"table"，并将"l"中所列出的函数注册为"table"的域。
     */

    //各个模块增加绑定
    int index = get_array_len(lib);
    lucy_reg(lib, index);
    index = get_array_len(lib);
    bigmap_reg(lib, index);
    index = get_array_len(lib);
    time_reg(lib, index);
    //结束绑定

    luaL_newlib(L, lib); //导出给lua

    return 1;
}










